package com.itheima.service;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.dao.UserDao;
import com.itheima.entity.PageResult;
import com.itheima.entity.QueryPageBean;
import com.itheima.exception.BusinessRuntimeException;
import com.itheima.pojo.Menu;
import com.itheima.pojo.Role;
import com.itheima.pojo.SysUser;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;

@Service
@Slf4j
public class UserServiceImpl implements UserService {

	@Autowired
	UserDao userDao;

	@Override
	public boolean login(String username, String password) {
		log.debug("service_provide...u:"+username+" p:"+password);
		if("admin".equals(username) && "123".equals(password)){
			return true;
		}else{
			throw new BusinessRuntimeException("登录失败");
		}
	}

	@Override
	public SysUser findByUsername(String username) {
		return userDao.findByUsername(username);
	}

	/**
	 *
	 * @param pageBean
	 * @return com.itheima.entity.PageResult
	 * @author xiaojian
	 * @creed: 查询分页结果
	 * @date 2020/7/7 23:03
	 */
	@Override
	public PageResult findPage(QueryPageBean pageBean) {
		//开始分页
		PageHelper.startPage(pageBean.getCurrentPage(),pageBean.getPageSize());
		//查询总记录数和查询条件
		Page<SysUser> page = userDao.findByCondition(pageBean.getQueryString());
		//将记录和总记录数封装
		return new PageResult(page.getTotal(),page);
	}

	//修改用户信息 同时将角色用户表更新
	@Transactional
	@Override
	public void updateUser(SysUser sysUser, Integer[] checkitemIds) {
		//1 删除所有关联表 角色表中间关系
		userDao.delRelation(sysUser.getId());
		//2 重新建立关系
		setRelation(sysUser.getId(),checkitemIds);
		//3 修改用户信息
		userDao.updateUser(sysUser);
	}

	//根据用户id设置用户--角色表关系
	private void setRelation(Integer sysId,Integer[] checkitemIds){
		if(checkitemIds != null && checkitemIds.length > 0){
			for (Integer checkitemId : checkitemIds) {
				userDao.setRelation(sysId, checkitemId);
			}
		}
	}

	/**
	 *
	 * @param id
	 * @return com.itheima.pojo.SysUser
	 * @author xiaojian
	 * @creed: 根据用户id查询用户基本信息
	 * @date 2020/7/8 15:03
	 */

	@Override
	public SysUser findByUserId(Integer id) {
		return userDao.findByUserId(id);
	}

	/**
	 *
	 * @param userId
	 * @return java.lang.Integer[]
	 * @author xiaojian
	 * @creed: 根据用户id查询用户权限id
	 * @date 2020/7/8 15:07
	 */

	@Override
	public List<Integer> findRoleIdByUserId(Integer userId) {
		return userDao.findRoleIdByUserId(userId);
	}

	/**
	 *
	 * @param sysUser
	 * @param checkitemIds
	 * @return void
	 * @author xiaojian
	 * @creed: 添加新用户
	 * @date 2020/7/8 15:43
	 */
	@Transactional
	@Override
	public void addUser(SysUser sysUser, Integer[] checkitemIds) {
		//1 添加用户 需要回显主键
		userDao.addUser(sysUser);
		//2 建立用户-角色关系 根据主键回显
		setRelation(sysUser.getId(),checkitemIds);
	}

	/**
	 *
	 * @param id
	 * @return void
	 * @author xiaojian
	 * @creed: 根据用户id删除
	 * @date 2020/7/8 16:12
	 */
	@Transactional
	@Override
	public void deleteUserById(Integer id) {
		//1 需要先判断中间角色表 删除角色表后
		List<Integer> roleIdByUserId = userDao.findRoleIdByUserId(id);
		if (roleIdByUserId.size() > 0){
			//执行删除中间用户角色表
			userDao.delRelation(id);
		}
		//2 删除用户
		userDao.deleteUserById(id);
	}

	/**
	 * 根据用户名查询菜单
	 * 在这里将菜单数据封装
	 * */
	@Override
	public List<Map<String, Object>> findMenuByUserName(String uname) {
		//根据用户名查询用户
		SysUser sysUser = userDao.findByUsername(uname);
		//根据用户id查询用户菜单信息
		if (sysUser==null){
			throw new BusinessRuntimeException("用户找不到");
		}
		//获取到sysuser
		Set<Role> roles = sysUser.getRoles();
		log.debug("获取到的角色:"+roles);

		//1 将数据封装到list
		List<Map<String,Object>> menuList = new ArrayList<>();
		//声明pages字符串
		String pages = "/pages/";


		//2 遍历角色 获取到菜单集合
		for (Role role : roles) {
			LinkedHashSet<Menu> menus = role.getMenus();
			//遍历菜单集合得到 一级菜单
			for (Menu menu : menus) {
				Map<String,Object> oneMenu = null;
				//判断是否有父菜单id属性是否为空
				if (menu.getParentMenuId()==null){
					//一级菜单的childern中是一个list<Map<String,Object>>
					//创建二集list
					List<Map<String,Object>> twochildernList = new ArrayList<>();
					//如果父id为空则是 一级菜单集合
					oneMenu = new HashMap<>();
					oneMenu.put("path",menu.getPath());
					oneMenu.put("title",menu.getName());
					oneMenu.put("icon",menu.getIcon());
					//想要放入二级标签遍历 判断父菜单id是否一致
					Map<String,Object> towMenu = null;
					//遍历菜单数据 放入子菜单
					for (Menu menu1 : menus) {
						towMenu = new HashMap<>();
							//判断父id与path相同 父id是数字  path是字符串
							if (menu.getId()==menu1.getParentMenuId()){
								//相等加入map
								towMenu.put("path",menu1.getPath());
								towMenu.put("title",menu1.getName());
								towMenu.put("linkUrl",pages+menu1.getLinkUrl());
								//这里可能会出错 null
								towMenu.put("children",null);
								//将所有的childern放入listchildern
								twochildernList.add(towMenu);
							}
					}
					//放入二季菜单
					oneMenu.put("children",twochildernList);
					//将本角色的菜单放入返回的数据集合  这里没考率到多个角色菜单去重
					menuList.add(oneMenu);
				}
			}
		}
		return menuList;
	}
}